home *** CD-ROM | disk | FTP | other *** search
/ Aminet 46 / Aminet 46 (2001)(GTI - Schatztruhe)[!][Dec 2001].iso / Aminet / text / edit / edt10src.lha / txt / ERequests.mod < prev    next >
Text File  |  1995-04-08  |  60KB  |  1,751 lines

  1. (*
  2.   .name       ERequests
  3.   .task       Edt requester library
  4.   .release    1.0
  5.   .language   Oberon-2
  6.   .translator Amiga Oberon 3.2
  7.   .system     AmigaOS 2.04/2.1/3.0
  8.   .author     Joachim Barheine
  9.   .address    Hochgrevestraße 3, D-38640 Goslar
  10.   .copyright  (c) 1995 by Joachim Barheine
  11. *)
  12.  
  13. (* .info: 30/01/95, 19:22:06, version 96 *)
  14.  
  15. MODULE ERequests;
  16.  
  17. IMPORT
  18.   SYS:= SYSTEM,
  19.  
  20.   ASCII,
  21.   ASL,
  22.   Dos,
  23.   EdtOS37,
  24.   Err:= ErrCodes,
  25.   Exec,
  26.   ExecSupport,
  27.   F:= Files,
  28.   GT:= GadTools,
  29.   Gfx:= Graphics,
  30.   GUI,
  31.   I:= Intuition,
  32.   IO:= IOServer,
  33.   K:= Kernel,
  34.   S:= Strings,
  35.   Sett:= Settings,
  36.   Str:= StrPool,
  37.   Util:= Utility;
  38.  
  39. CONST
  40.   (* search/replace request: *)
  41.   cmdCancel* = 0;
  42.   cmdNext*   = 1;
  43.   cmdPrev*   = 2;
  44.  
  45.   (* replace request: *)
  46.   cmdStop* = 0;
  47.   cmdYes* = 1;
  48.   cmdNo*    = 2;
  49.   cmdAll*     = 3;
  50.  
  51.   (* search/replace flags: *)
  52.   ignoreCase* = 0;
  53.   findWord*   = 1;
  54.  
  55.   (* goto/number/string/choice/options request: *)
  56.   (* cmdCancel* = 0 *)
  57.   cmdOk* = 1;
  58.  
  59.   (* prefs request: *)
  60.   (* cmdCancel* = 0 *)
  61.   cmdUse*         = 1;
  62.  
  63.   (* gadget IDs *)
  64.   aCancelID     = 0;
  65.   searchID      = 1;
  66.   replaceID     = 2;
  67.   ignoreCaseID  = 3;
  68.   findWordID    = 4;
  69.   linkChgsID    = 5;
  70.   aNextID       = 6;
  71.   aPrevID       = 7;
  72.   aYesID        = 8;
  73.   aNoID         = 9;
  74.   aAllID        = 10;
  75.   aStopID   = 11;
  76.   numberID      = 12;
  77.   stringID      = 13;
  78.   mxID          = 14;
  79.   aOkID         = 15;
  80.   maxChgsID     = 16;
  81.   tabAlignID= 17;
  82.   marginID      = 18;
  83.   aQueryFontID= 19;
  84.   aQuerySModeID= 20;
  85.   autosaveID= 21;
  86.   autosaveDelayID= 22;
  87.   backupsID = 23;
  88.   sTypeID       = 24;
  89.   leftMarginID= 28;
  90.   rightMarginID= 27;
  91.   linesID   = 28;
  92.   colSpacingID= 29;
  93.   pitchID   = 30;
  94.   spacingID = 31;
  95.   qualityID = 32;
  96.   formattingID= 33;
  97.   lineNumbersID= 34;
  98.   hTimeID   = 35;
  99.   hTitleID  = 36;
  100.   hNumbersID= 37;
  101.   hDateID   = 38;
  102.   convTabsID= 39;
  103.   closeFldsID = 40;
  104.   rmbChgsID = 41;
  105.   sNameID   = 42;
  106.   foldHeaderID = 43;
  107.   scrollerSizeID = 44;
  108.   rmbPosID = 45;
  109.  
  110.   opt0ID    = 46;
  111.  
  112. TYPE
  113.   String= ARRAY 256 OF CHAR;
  114.  
  115. VAR
  116.   fileReq- : ASL.FileRequesterPtr;
  117.   fontReq- : ASL.FontRequesterPtr;
  118.   screenReq- : ASL.ScreenModeRequesterPtr;
  119.  
  120.   reqMsg: ARRAY 512 OF CHAR;
  121.  
  122.   backupsLabelArray, autosaveLabelArray, sTypeLabelArray: GUI.LabelArray;
  123.   pitchLabelArray, spacingLabelArray, qualityLabelArray,
  124.   formattingLabelArray, foldHeaderLabelArray, scrollerSizeLabelArray: GUI.LabelArray;
  125.  
  126.   aCancelWd, aSearchWd, aSearchBackWd, aReplaceWd, aReplaceBackWd,
  127.   findWordWd, ignoreCaseWd, linkChgsWd, searchWd, replaceWd, aStopWd, aYesWd,
  128.   aNoWd, aAllWd, aOkWd, maxChgsWd, tabAlignWd, marginWd, fontNameWd,
  129.   autosaveWd, autosaveLabelArrayWd, autosaveDelayWd, backupsWd,
  130.   backupsLabelArrayWd, sTypeWd, sTypeLabelArrayWd, leftMarginWd,
  131.   rightMarginWd, linesWd, colSpacingWd, pitchWd, pitchLabelArrayWd, spacingWd,
  132.   spacingLabelArrayWd, qualityWd, qualityLabelArrayWd, formattingWd,
  133.   formattingLabelArrayWd, lineNumbersWd, hTimeWd, hTitleWd, hNumbersWd,
  134.   hDateWd, convTabsWd, closeFldsWd, rmbChgsWd, sNameWd, sModeNameWd,
  135.   foldHeaderWd, foldHeaderLabelArrayWd, aQueryWd, scrollerSizeWd,
  136.   scrollerSizeLabelArrayWd: INTEGER;
  137.  
  138.   backupsLabelArrayLen, autosaveLabelArrayLen, sTypeLabelArrayLen,
  139.   pitchLabelArrayLen, spacingLabelArrayLen, qualityLabelArrayLen,
  140.   formattingLabelArrayLen, foldHeaderLabelArrayLen,
  141.   scrollerSizeLabelArrayLen: SHORTINT;
  142.  
  143.   winX, winY: INTEGER;
  144.  
  145. PROCEDURE CreateOkCancelGads(wWidth, wHeight: INTEGER): BOOLEAN;
  146.  
  147. VAR
  148.   y: INTEGER;
  149.  
  150. BEGIN
  151.   y:= wHeight - 4 - GUI.buttonHt;
  152.   GUI.NewCol(8, y, -1);
  153.   IF GUI.CreateButtonGad(aOkID, Str.aOk^, aCancelWd, TRUE) = NIL THEN RETURN FALSE END;
  154.   GUI.NewCol(wWidth - 8 - aCancelWd, y, -1);
  155.   IF GUI.CreateButtonGad(aCancelID, Str.aCancel^, aCancelWd, TRUE) = NIL THEN RETURN FALSE END;
  156.   RETURN TRUE;
  157. END CreateOkCancelGads;
  158.  
  159. PROCEDURE ReqAction* (w: I.WindowPtr; message, gadgets: ARRAY OF CHAR): SHORTINT;
  160.  
  161. (* message: the message as C-style-formatting-string *)
  162. (* gadgets: the gadgetlabels *)
  163.  
  164. VAR
  165.   easy: I.EasyStruct;
  166.   i: INTEGER;
  167.   result: SHORTINT;
  168.  
  169. (* $CopyArrays- *)
  170.  
  171. BEGIN
  172.   i:= 0;
  173.   WHILE message[i] # 0X DO
  174.     IF message[i]= "|" THEN message[i]:= ASCII.lf END;
  175.     INC(i);
  176.   END;
  177.  
  178.   easy.structSize  := SIZE(I.EasyStruct);
  179.   easy.flags       := LONGSET{};
  180.   easy.textFormat  := SYS.ADR(message);
  181.   easy.gadgetFormat:= SYS.ADR(gadgets);
  182.   easy.title       := SYS.ADR(Str.edt);
  183.  
  184.   result:= SHORT(SHORT(I.EasyRequest(w, SYS.ADR(easy), NIL, Util.done)));
  185.   IO.Refresh;
  186.   RETURN result;
  187. END ReqAction;
  188.  
  189. PROCEDURE ReqMessage* (w: I.WindowPtr; msg, gad: ARRAY OF CHAR);
  190.  
  191. (* $CopyArrays- *)
  192.  
  193. BEGIN
  194.   IF ReqAction(w, msg, gad) = 0 THEN END;
  195. END ReqMessage;
  196.  
  197. PROCEDURE ReqActionArgs* (w: I.WindowPtr; msg, gads: ARRAY OF CHAR; arg0, arg1: LONGINT): SHORTINT;
  198.  
  199. VAR
  200.   a: ARRAY 2 OF LONGINT;
  201.  
  202. (* $CopyArrays- *)
  203.  
  204. BEGIN
  205.   a[0]:= arg0; a[1]:= arg1;
  206.   K.FormatString(reqMsg, msg, a);
  207.   RETURN ReqAction(w, reqMsg, gads);
  208. END ReqActionArgs;
  209.  
  210. PROCEDURE ReqFont* (w: I.WindowPtr; VAR spec: Gfx.TextAttr): BOOLEAN;
  211.  
  212. VAR
  213.   result: BOOLEAN;
  214.  
  215. BEGIN
  216.   result:= ASL.AslRequestTags(fontReq, ASL.window, w, Util.done);
  217.   IF result = TRUE THEN spec:= fontReq.attr END;
  218.   IO.Refresh;
  219.   RETURN result;
  220. END ReqFont;
  221.  
  222. PROCEDURE ReqFile* (w: I.WindowPtr; VAR filename: ARRAY OF CHAR; save: BOOLEAN): BOOLEAN;
  223.  
  224. VAR
  225.   hail: Exec.LSTRPTR;
  226.   path: ARRAY F.pathLen OF CHAR;
  227.   name: ARRAY F.nameLen OF CHAR;
  228.   lock: Dos.FileLockPtr;
  229.   result: BOOLEAN;
  230.  
  231. BEGIN
  232.   F.GetPath(path, filename); F.GetName(name, filename);
  233.   IF save THEN
  234.     hail:= Str.saveHail;
  235.   ELSE
  236.     hail:= Str.loadHail;
  237.   END;
  238.   result:= ASL.AslRequestTags(fileReq, ASL.window, w,
  239.                               ASL.titleText, hail,
  240.                               ASL.doSaveMode, I.BoolToLong(save),
  241.                               ASL.initialDrawer, SYS.ADR(path),
  242.                               ASL.initialFile, SYS.ADR(name),
  243.                               Util.done) & (fileReq.file^ # "");
  244.   IF result = TRUE THEN
  245.     F.GetFilename(filename, fileReq.dir^, fileReq.file^);
  246.     lock:= Dos.Lock(filename, Dos.sharedLock);
  247.     IF lock # NIL THEN
  248.       IF ~Dos.NameFromLock(lock, filename, LEN(filename)) THEN END;
  249.       Dos.UnLock(lock);
  250.     END;
  251.   END;
  252.   IO.Refresh;
  253.   RETURN result;
  254. END ReqFile;
  255.  
  256. PROCEDURE ReqNumber* (w: I.WindowPtr; title, label: ARRAY OF CHAR;
  257.                       VAR number: LONGINT): SHORTINT;
  258.  
  259. VAR
  260.   result: SHORTINT;
  261.   win: I.WindowPtr;
  262.   ww, wh: INTEGER;
  263.   g, gadList, context: I.GadgetPtr;
  264.   numberGad: I.GadgetPtr;
  265.   iMsg: I.IntuiMessagePtr;
  266.   c: CHAR;
  267.   code: INTEGER;
  268.  
  269.   PROCEDURE CreateGadgets(VAR wWidth, wHeight: INTEGER): BOOLEAN;
  270.  
  271.   VAR
  272.     gw: INTEGER;
  273.  
  274.   BEGIN
  275.     context:= GUI.CreateContextGad(gadList);
  276.     K.Assert(context # NIL, Err.userNoGadgets);
  277.  
  278.     wWidth:= 24 + (2 * aCancelWd);
  279.     wHeight:= 8 + GUI.stringHt + 8 + GUI.buttonHt + 4;
  280.  
  281.     gw:= GUI.TextWidth(label) + (6 * GUI.zeroWd) + 18;
  282.     GUI.GetMax(wWidth, gw + 16);
  283.  
  284.     GUI.NewCol((wWidth - gw) DIV 2 + GUI.TextWidth(label) + 6, 8, -1);
  285.     numberGad:= GUI.CreateIntegerGad(numberID, label, (6 * GUI.zeroWd) + 12, number, 10, TRUE);
  286.  
  287.     RETURN CreateOkCancelGads(wWidth, wHeight);
  288.   END CreateGadgets;
  289.  
  290. (* $CopyArrays- *)
  291.  
  292. BEGIN
  293.   result:= cmdCancel;
  294.   gadList:= NIL;
  295.   IF CreateGadgets(ww, wh) THEN
  296.     win:= GUI.OpenReqWindow(title, w, ww, wh,
  297.                         LONGSET{I.refreshWindow, I.changeWindow, I.vanillaKey}
  298.                         + GT.buttonIDCMP + GT.integerIDCMP, gadList);
  299.     IF win # NIL THEN
  300.       GUI.ActivateGad(numberGad, win);
  301.       LOOP
  302.         iMsg:= GUI.ObtainIMsg(win);
  303.         CASE GUI.IMsgClass(iMsg.class) OF
  304.                   I.refreshWindow:
  305.                         GT.BeginRefresh(win);
  306.                         GT.EndRefresh(win, I.LTRUE);
  307.                         GT.ReplyIMsg(iMsg);
  308.                 | I.changeWindow:
  309.                         IO.Refresh;
  310.                         GT.ReplyIMsg(iMsg);
  311.                 | I.gadgetUp:
  312.                         g:= iMsg.iAddress;
  313.                         code:= iMsg.code;
  314.                         GT.ReplyIMsg(iMsg);
  315.                         CASE g.gadgetID OF
  316.                           numberID:
  317.                                 IF (code # GUI.escKey) & (code # GUI.tabKey) THEN
  318.                                   result:= cmdOk;
  319.                                   EXIT;
  320.                                 END;
  321.                         | aOkID:
  322.                                 result:= cmdOk;
  323.                                 EXIT;
  324.                         | aCancelID:
  325.                                 result:= cmdCancel;
  326.                                 EXIT;
  327.                         END;
  328.                 | I.vanillaKey:
  329.                         c:= Util.ToUpper(CHR(iMsg.code));
  330.                         GT.ReplyIMsg(iMsg);
  331.                         IF c= Str.aOkCh THEN
  332.               result:= cmdOk;
  333.               EXIT;
  334.             ELSIF c= Str.aCancelCh THEN
  335.               result:= cmdCancel;
  336.               EXIT;
  337.             ELSE
  338.               GUI.Flash;
  339.             END;
  340.         ELSE
  341.           GT.ReplyIMsg(iMsg);
  342.         END;
  343.       END;
  344.       IF result = cmdOk THEN number:= numberGad.specialInfo(I.StringInfo).longInt END;
  345.       I.CloseWindow(win);
  346.     END;
  347.     GT.FreeGadgets(gadList);
  348.   END;
  349.   IO.Refresh;
  350.   RETURN result;
  351. END ReqNumber;
  352.  
  353. PROCEDURE ReqString* (w: I.WindowPtr; title, label: ARRAY OF CHAR;
  354.                       VAR string: ARRAY OF CHAR): SHORTINT;
  355.  
  356. VAR
  357.   result: SHORTINT;
  358.   win: I.WindowPtr;
  359.   ww, wh: INTEGER;
  360.   g, gadList, context: I.GadgetPtr;
  361.   stringGad: I.GadgetPtr;
  362.   iMsg: I.IntuiMessagePtr;
  363.   c: CHAR;
  364.   code: INTEGER;
  365.  
  366.   PROCEDURE CreateGadgets(VAR wWidth, wHeight: INTEGER): BOOLEAN;
  367.  
  368.   VAR
  369.     gw: INTEGER;
  370.  
  371.   BEGIN
  372.     context:= GUI.CreateContextGad(gadList);
  373.     K.Assert(context # NIL, Err.userNoGadgets);
  374.  
  375.     wWidth:= 24 + (2 * aCancelWd);
  376.     wHeight:= GUI.stringHt + GUI.buttonHt + 20;
  377.  
  378.     gw:= GUI.TextWidth(label) + 338;
  379.     GUI.GetMax(wWidth, gw + 16);
  380.  
  381.     GUI.NewCol((wWidth - gw) DIV 2 + (GUI.TextWidth(label) + 6), 8, -1);
  382.     stringGad:= GUI.CreateStringGad(stringID, label, 332, string, TRUE);
  383.  
  384.     RETURN CreateOkCancelGads(wWidth, wHeight);
  385.   END CreateGadgets;
  386.  
  387. (* $CopyArrays- *)
  388.  
  389. BEGIN
  390.   result:= cmdCancel;
  391.   gadList:= NIL;
  392.   IF CreateGadgets(ww, wh) THEN
  393.     win:= GUI.OpenReqWindow(title, w, ww, wh,
  394.                         LONGSET{I.refreshWindow, I.changeWindow, I.vanillaKey}
  395.                         + GT.buttonIDCMP + GT.stringIDCMP, gadList);
  396.     IF win # NIL THEN
  397.       GUI.ActivateGad(stringGad, win);
  398.       LOOP
  399.         iMsg:= GUI.ObtainIMsg(win);
  400.         CASE GUI.IMsgClass(iMsg.class) OF
  401.                   I.refreshWindow:
  402.                         GT.BeginRefresh(win);
  403.                         GT.EndRefresh(win, I.LTRUE);
  404.                         GT.ReplyIMsg(iMsg);
  405.                 | I.changeWindow:
  406.                         IO.Refresh;
  407.                         GT.ReplyIMsg(iMsg);
  408.                 | I.gadgetUp:
  409.                         g:= iMsg.iAddress;
  410.                         code:= iMsg.code;
  411.                         GT.ReplyIMsg(iMsg);
  412.                         CASE g.gadgetID OF
  413.                           stringID:
  414.                                 IF (code # GUI.escKey) & (code # GUI.tabKey) THEN
  415.                                   result:= cmdOk;
  416.                                   EXIT;
  417.                                 END;
  418.                         | aOkID:
  419.                                 result:= cmdOk;
  420.                                 EXIT;
  421.                         | aCancelID:
  422.                                 result:= cmdCancel;
  423.                                 EXIT;
  424.                         END;
  425.                 | I.vanillaKey:
  426.                         c:= Util.ToUpper(CHR(iMsg.code));
  427.                         GT.ReplyIMsg(iMsg);
  428.             IF c= Str.aOkCh THEN
  429.               result:= cmdOk;
  430.               EXIT;
  431.             ELSIF c= Str.aCancelCh THEN
  432.               result:= cmdCancel;
  433.               EXIT;
  434.             ELSE
  435.               GUI.Flash;
  436.             END;
  437.                 ELSE
  438.                   GT.ReplyIMsg(iMsg);
  439.                 END;
  440.       END;
  441.       IF result = cmdOk THEN COPY(stringGad.specialInfo(I.StringInfo).buffer^, string) END;
  442.       I.CloseWindow(win);
  443.     END;
  444.     GT.FreeGadgets(gadList);
  445.   END;
  446.   IO.Refresh;
  447.   RETURN result;
  448. END ReqString;
  449.  
  450. PROCEDURE ReqChoice* (w: I.WindowPtr; title, label, mxLabels: ARRAY OF CHAR;
  451.                       VAR choice: SHORTINT): SHORTINT;
  452.  
  453. VAR
  454.   result: SHORTINT;
  455.   win: I.WindowPtr;
  456.   ww, wh: INTEGER;
  457.   g, gadList, context: I.GadgetPtr;
  458.   mxLabelArray: GUI.LabelArray;
  459.   mxLabelWidth, labelLen, labelWd: INTEGER;
  460.   mxLabelArrayLen: SHORTINT;
  461.   iMsg: I.IntuiMessagePtr;
  462.   c: CHAR;
  463.   active: SHORTINT;
  464.  
  465.   PROCEDURE CreateGadgets(VAR wWidth, wHeight: INTEGER): BOOLEAN;
  466.  
  467.   BEGIN
  468.     context:= GUI.CreateContextGad(gadList);
  469.     K.Assert(context # NIL, Err.userNoGadgets);
  470.  
  471.     wWidth:= 10 + (2 * aCancelWd);
  472.     GUI.GetMax(wWidth, mxLabelWidth + GUI.mxWd + 6);
  473.     GUI.GetMax(wWidth, labelWd);
  474.     INC(wWidth, 32);
  475.     wHeight:= GUI.reqFont.ySize + 20 + mxLabelArrayLen
  476.               * (GUI.reqFont.ySize + GUI.mxSpacing) + GUI.buttonHt;
  477.  
  478.     GUI.NewCol((wWidth - (mxLabelWidth + GUI.mxWd + 6)) DIV 2, GUI.reqFont.ySize + 8, -1);
  479.     RETURN (GUI.CreateMXGad(mxID, label, mxLabelArray, active) # NIL)
  480.          & CreateOkCancelGads(wWidth, wHeight);
  481.   END CreateGadgets;
  482.  
  483.   PROCEDURE WriteText;
  484.  
  485.   BEGIN
  486.     IF K.intVer < 39 THEN
  487.       Gfx.Move(win.rPort, (win.width - labelWd) DIV 2, win.borderTop + 4 + GUI.reqFont.baseline);
  488.       Gfx.Text(win.rPort, label, labelLen);
  489.     END;
  490.   END WriteText;
  491.  
  492. (* $CopyArrays- *)
  493.  
  494. BEGIN
  495.   active:= choice;
  496.   result:= cmdCancel;
  497.   gadList:= NIL;
  498.   GUI.CreateLabelArray(mxLabelArray, mxLabelArrayLen, mxLabelWidth, mxLabels);
  499.   labelLen:= SHORT(S.Length(label)); labelWd:= GUI.TextWidth(label);
  500.   IF CreateGadgets(ww, wh) THEN
  501.     win:= GUI.OpenReqWindow(title, w, ww, wh,
  502.                         LONGSET{I.refreshWindow, I.changeWindow, I.vanillaKey}
  503.                         + GT.buttonIDCMP + GT.mxIDCMP, gadList);
  504.     IF win # NIL THEN
  505.       Gfx.SetAPen(win.rPort, IO.highTextPen);
  506.       Gfx.SetFont(win.rPort, GUI.reqFont);
  507.       WriteText;
  508.       LOOP
  509.         iMsg:= GUI.ObtainIMsg(win);
  510.         CASE GUI.IMsgClass(iMsg.class) OF
  511.           I.refreshWindow: GT.BeginRefresh(win);
  512.                            WriteText;
  513.                            GT.EndRefresh(win, I.LTRUE);
  514.                            GT.ReplyIMsg(iMsg);
  515.         | I.changeWindow:  IO.Refresh;
  516.                            GT.ReplyIMsg(iMsg);
  517.         | I.gadgetDown:    g:= iMsg.iAddress;
  518.                            IF g.gadgetID = mxID THEN
  519.                              active:= SHORT(iMsg.code);
  520.                            END;
  521.                            GT.ReplyIMsg(iMsg);
  522.         | I.gadgetUp:      g:= iMsg.iAddress;
  523.                            GT.ReplyIMsg(iMsg);
  524.                            CASE g.gadgetID OF
  525.                              mxID:      (* igonore *)
  526.                            | aOkID:     result:= cmdOk;
  527.                                         EXIT;
  528.                            | aCancelID: result:= cmdCancel;
  529.                                         EXIT;
  530.                            END;
  531.         | I.vanillaKey:    c:= Util.ToUpper(CHR(iMsg.code));
  532.                            GT.ReplyIMsg(iMsg);
  533.         ELSE
  534.           GT.ReplyIMsg(iMsg);
  535.         END;
  536.       END;
  537.       IF result= cmdOk THEN choice:= active END;
  538.       I.CloseWindow(win);
  539.     END;
  540.     GT.FreeGadgets(gadList);
  541.   END;
  542.   GUI.DisposeLabelArray(mxLabelArray);
  543.   IO.Refresh;
  544.   RETURN result;
  545. END ReqChoice;
  546.  
  547. PROCEDURE ReqOptions* (w: I.WindowPtr; title, label, optLabels: ARRAY OF CHAR;
  548.                        VAR options: LONGSET): SHORTINT;
  549.  
  550. VAR
  551.   result: SHORTINT;
  552.   win: I.WindowPtr;
  553.   ww, wh: INTEGER;
  554.   g, gadList, context: I.GadgetPtr;
  555.   optLabelArray: GUI.LabelArray;
  556.   opt, optLabelWidth, labelLen, labelWd: INTEGER;
  557.   optLabelArrayLen: SHORTINT;
  558.   iMsg: I.IntuiMessagePtr;
  559.   opts: LONGSET;
  560.   c: CHAR;
  561.  
  562.   PROCEDURE CreateGadgets(VAR wWidth, wHeight: INTEGER): BOOLEAN;
  563.  
  564.   VAR
  565.     str: UNTRACED POINTER TO String;
  566.     i, cols, lines: SHORTINT;
  567.  
  568.   BEGIN
  569.     context:= GUI.CreateContextGad(gadList);
  570.     K.Assert(context # NIL, Err.userNoGadgets);
  571.  
  572.     cols:= 1;
  573.     IF optLabelArrayLen > 7 THEN cols:= 2 END;
  574.     IF optLabelArrayLen > 21 THEN cols:= 3 END;
  575.     lines:= (optLabelArrayLen + cols - 1) DIV cols;
  576.  
  577.     wWidth:= 10 + (2 * aCancelWd);
  578.     wHeight:= GUI.reqFont.ySize + 20 + lines * (GUI.checkBoxHt + GUI.cbSpacing) + GUI.buttonHt;
  579.     GUI.GetMax(wWidth, cols * (optLabelWidth + GUI.checkBoxWd + 6 + 10));
  580.     GUI.GetMax(wWidth, labelWd + 10);
  581.     INC(wWidth, 32);
  582.  
  583.     FOR i:= 0 TO optLabelArrayLen - 1 DO
  584.       IF i MOD lines = 0 THEN
  585.         GUI.NewCol(16 + (i DIV lines) * (optLabelWidth + GUI.checkBoxWd + 6 + 10), GUI.reqFont.ySize + 8, GUI.cbSpacing);
  586.       END;
  587.       str:= optLabelArray[i];
  588.       IF GUI.CreateCheckBoxGad(opt0ID + i, str^, i IN opts, TRUE) = NIL THEN RETURN FALSE END;
  589.     END;
  590.  
  591.     RETURN CreateOkCancelGads(wWidth, wHeight);
  592.   END CreateGadgets;
  593.  
  594.   PROCEDURE WriteText;
  595.  
  596.   BEGIN
  597.     Gfx.Move(win.rPort,
  598.              (win.width - labelWd) DIV 2, win.borderTop + 4 + GUI.reqFont.baseline);
  599.     Gfx.Text(win.rPort, label, labelLen);
  600.   END WriteText;
  601.  
  602. (* $CopyArrays- *)
  603.  
  604. BEGIN
  605.   opts:= options;
  606.   result:= cmdCancel;
  607.   gadList:= NIL;
  608.   labelLen:= SHORT(S.Length(label)); labelWd:= GUI.TextWidth(label);
  609.   GUI.CreateLabelArray(optLabelArray, optLabelArrayLen, optLabelWidth, optLabels);
  610.   IF CreateGadgets(ww, wh) THEN
  611.     win:= GUI.OpenReqWindow(title, w, ww, wh,
  612.                         LONGSET{I.refreshWindow, I.changeWindow, I.vanillaKey}
  613.                         + GT.buttonIDCMP + GT.checkBoxIDCMP, gadList);
  614.     IF win # NIL THEN
  615.       Gfx.SetAPen(win.rPort, IO.highTextPen);
  616.       Gfx.SetFont(win.rPort, GUI.reqFont);
  617.       WriteText;
  618.       LOOP
  619.         iMsg:= GUI.ObtainIMsg(win);
  620.         CASE GUI.IMsgClass(iMsg.class) OF
  621.           I.refreshWindow:
  622.             GT.BeginRefresh(win);
  623.             WriteText;
  624.             GT.EndRefresh(win, I.LTRUE);
  625.             GT.ReplyIMsg(iMsg);
  626.         | I.changeWindow:
  627.             IO.Refresh;
  628.             GT.ReplyIMsg(iMsg);
  629.         | I.gadgetUp:
  630.             g:= iMsg.iAddress;
  631.             GT.ReplyIMsg(iMsg);
  632.             CASE g.gadgetID OF
  633.               opt0ID..opt0ID+31:
  634.                          opt:= g.gadgetID-opt0ID;
  635.                          IF opt IN opts THEN
  636.                            EXCL(opts, opt);
  637.                          ELSE
  638.                            INCL(opts, opt);
  639.                          END;
  640.             | aOkID:     result:= cmdOk;
  641.                          EXIT;
  642.             | aCancelID: result:= cmdCancel;
  643.                          EXIT;
  644.             END;
  645.         | I.vanillaKey:
  646.             c:= Util.ToUpper(CHR(iMsg.code));
  647.             GT.ReplyIMsg(iMsg);
  648.                    IF c= Str.aOkCh THEN
  649.               result:= cmdOk;
  650.               EXIT;
  651.             ELSIF c= Str.aCancelCh THEN
  652.               result:= cmdCancel;
  653.               EXIT;
  654.             ELSE
  655.               GUI.Flash;
  656.             END;
  657.         ELSE
  658.           GT.ReplyIMsg(iMsg);
  659.         END;
  660.       END;
  661.       IF result= cmdOk THEN options:= opts END;
  662.       I.CloseWindow(win);
  663.     END;
  664.     GT.FreeGadgets(gadList);
  665.   END;
  666.   GUI.DisposeLabelArray(optLabelArray);
  667.   IO.Refresh;
  668.   RETURN result;
  669. END ReqOptions;
  670.  
  671. PROCEDURE ReqEditPrefs* (w: I.WindowPtr; VAR convTabs, closeFlds, rmbPos,
  672.                     rmbChgs: BOOLEAN; VAR undoBufSize, tabAlign, margin,
  673.                     autosaveDelay: INTEGER; VAR backups, autosave: SHORTINT): SHORTINT;
  674.  
  675. VAR
  676.   result: SHORTINT;
  677.   defConfig: BOOLEAN;  (* running with default configuration *)
  678.   win: I.WindowPtr;
  679.   ww, wh: INTEGER;
  680.   g, gadList, context: I.GadgetPtr;
  681.   convTabsGad, closeFldsGad, rmbPosGad, rmbChgsGad, maxChgsGad, tabAlignGad, marginGad,
  682.   autosaveDelayGad, backupsGad, autosaveGad: I.GadgetPtr;
  683.   iMsg: I.IntuiMessagePtr;
  684.   c: CHAR;
  685.   code: INTEGER;
  686.   convTabsNew, closeFldsNew, rmbPosNew, rmbChgsNew: BOOLEAN;
  687.   backupsNew, autosaveNew: SHORTINT;
  688.  
  689.   PROCEDURE CreateGadgets(VAR wWidth, wHeight: INTEGER): BOOLEAN;
  690.  
  691.   VAR
  692.     y: INTEGER;
  693.     w0, x1, w1, x2, w2: INTEGER;
  694.  
  695.   BEGIN
  696.     context:= GUI.CreateContextGad(gadList);
  697.     K.Assert(context # NIL, Err.userNoGadgets);
  698.  
  699.     w0:= convTabsWd; GUI.GetMax(w0, closeFldsWd); GUI.GetMax(w0, rmbChgsWd);
  700.     x1:= maxChgsWd; GUI.GetMax(x1, tabAlignWd); GUI.GetMax(x1, marginWd);
  701.     GUI.GetMax(x1, autosaveDelayWd);
  702.     INC(x1, GUI.horizOffs + GUI.checkBoxWd + w0 + GUI.horizSpc);
  703.     w1:= (6 * GUI.zeroWd) + 12;
  704.  
  705.     x2:= backupsWd; GUI.GetMax(x2, autosaveWd);
  706.     INC(x2, GUI.horizOffs);
  707.     w2:= backupsLabelArrayWd; GUI.GetMax(w2, autosaveLabelArrayWd);
  708.  
  709.     GUI.NewCol(GUI.horizOffs, GUI.vertOffs, GUI.cbSpacing);
  710.     convTabsGad:= GUI.CreateCheckBoxGad(convTabsID, Str.convTabs^, convTabsNew, TRUE);
  711.     closeFldsGad:= GUI.CreateCheckBoxGad(closeFldsID, Str.closeFlds^, closeFldsNew, TRUE);
  712.     rmbPosGad:= GUI.CreateCheckBoxGad(rmbPosID, Str.rmbPos^, rmbPosNew, TRUE);
  713.     rmbChgsGad:= GUI.CreateCheckBoxGad(rmbChgsID, Str.rmbChgs^, rmbChgsNew, TRUE);
  714.  
  715.     GUI.NewCol(x1, GUI.vertOffs, 2);
  716.     maxChgsGad:= GUI.CreateIntegerGad(maxChgsID, Str.maxChgs^, w1, undoBufSize, 5, rmbChgsNew);
  717.     tabAlignGad:= GUI.CreateIntegerGad(tabAlignID, Str.tabAlign^, w1, tabAlign, 2, TRUE);
  718.     marginGad:= GUI.CreateIntegerGad(marginID, Str.margin^, w1, margin, 2, TRUE);
  719.     autosaveDelayGad:= GUI.CreateIntegerGad(autosaveDelayID, Str.autosaveDelay^, w1,
  720.                                         autosaveDelay, 2, autosave # Sett.autosaveOff);
  721.     GUI.NewCol(x2, GUI.layoutY + GUI.vertOffs, 2);
  722.     backupsGad:= GUI.CreateCycleGad(backupsID, Str.backups^, w2, backupsLabelArray, backups, TRUE);
  723.     autosaveGad:= GUI.CreateCycleGad(autosaveID, Str.autosave^, w2, autosaveLabelArray, autosave, TRUE);
  724.  
  725.     wWidth:= x1 + w1 + GUI.horizOffs;
  726.     wHeight:= GUI.layoutY + GUI.vertSpc + GUI.buttonHt + GUI.vertOffs;
  727.  
  728.     RETURN CreateOkCancelGads(wWidth, wHeight);
  729.   END CreateGadgets;
  730.  
  731.   (* update autosave-delay gadget *)
  732.   PROCEDURE UpdateASD;
  733.  
  734.   BEGIN
  735.     GT.SetGadgetAttrs(autosaveDelayGad^, win, NIL, I.gaDisabled,
  736.                       I.BoolToLong(autosaveNew = Sett.autosaveOff), Util.done);
  737.   END UpdateASD;
  738.  
  739.   (* update undobuffer-size gadget *)
  740.   PROCEDURE UpdateUBS;
  741.  
  742.   BEGIN
  743.     GT.SetGadgetAttrs(maxChgsGad^, win, NIL, I.gaDisabled, I.BoolToLong(~rmbChgsNew),
  744.                       Util.done);
  745.   END UpdateUBS;
  746.  
  747. BEGIN
  748.   defConfig:= (Sett.configName = Sett.defConfig);
  749.   convTabsNew:= convTabs;
  750.   closeFldsNew:= closeFlds;
  751.   rmbPosNew:= rmbPos;
  752.   rmbChgsNew:= rmbChgs;
  753.   backupsNew:= backups;
  754.   autosaveNew:= autosave;
  755.   result:= cmdCancel;
  756.   gadList:= NIL;
  757.   IF CreateGadgets(ww, wh) THEN
  758.     win:= GUI.OpenReqWindow(Str.editPrefsTitle^, w, ww, wh,
  759.                         LONGSET{I.refreshWindow, I.changeWindow, I.vanillaKey} + GT.buttonIDCMP
  760.                         + GT.checkBoxIDCMP + GT.integerIDCMP + GT.cycleIDCMP, gadList);
  761.     IF win # NIL THEN
  762.       LOOP
  763.         iMsg:= GUI.ObtainIMsg(win);
  764.         CASE GUI.IMsgClass(iMsg.class) OF
  765.           I.refreshWindow:
  766.                         GT.BeginRefresh(win);
  767.                         GT.EndRefresh(win, I.LTRUE);
  768.                         GT.ReplyIMsg(iMsg);
  769.         | I.changeWindow:
  770.                         IO.Refresh;
  771.                         GT.ReplyIMsg(iMsg);
  772.         | I.gadgetUp:
  773.           g:= iMsg.iAddress;
  774.           code:= iMsg.code;
  775.           GT.ReplyIMsg(iMsg);
  776.           CASE g.gadgetID OF
  777.             convTabsID:
  778.             convTabsNew:= ~convTabsNew;
  779.           | closeFldsID:
  780.             closeFldsNew:= ~closeFldsNew;
  781.           | rmbPosID:
  782.             rmbPosNew:= ~rmbPosNew;
  783.           | rmbChgsID:
  784.             rmbChgsNew:= ~rmbChgsNew;
  785.             UpdateUBS;
  786.           | maxChgsID:
  787.             IF maxChgsGad.specialInfo(I.StringInfo).longInt <= 0 THEN
  788.               GUI.ToggleGad(rmbChgsGad, win, rmbChgsNew);
  789.             END;
  790.           | backupsID:
  791.             backupsNew:= SHORT(code);
  792.           | autosaveID:
  793.             autosaveNew:= SHORT(code);
  794.             UpdateASD;
  795.           | aOkID:
  796.             result:= cmdUse;
  797.             EXIT;
  798.           | aCancelID:
  799.             result:= cmdCancel;
  800.             EXIT
  801.           ELSE
  802.             (* ignore *)
  803.           END;
  804.         | I.vanillaKey:
  805.           c:= Util.ToUpper(CHR(iMsg.code));
  806.           GT.ReplyIMsg(iMsg);
  807.           IF c= Str.convTabsCh THEN
  808.             GUI.ToggleGad(convTabsGad, win, convTabsNew);
  809.           ELSIF c= Str.closeFldsCh THEN
  810.             GUI.ToggleGad(closeFldsGad, win, closeFldsNew);
  811.           ELSIF c= Str.rmbPosCh THEN
  812.             GUI.ToggleGad(rmbPosGad, win, rmbPosNew);
  813.           ELSIF c= Str.rmbChgsCh THEN
  814.             GUI.ToggleGad(rmbChgsGad, win, rmbChgsNew);
  815.             UpdateUBS;
  816.           ELSIF c= Str.maxChgsCh THEN
  817.             GUI.ActivateGad(maxChgsGad, win);
  818.           ELSIF c= Str.tabAlignCh THEN
  819.             GUI.ActivateGad(tabAlignGad, win);
  820.           ELSIF c= Str.marginCh THEN
  821.             GUI.ActivateGad(marginGad, win);
  822.           ELSIF c= Str.autosaveDelayCh THEN
  823.             GUI.ActivateGad(autosaveDelayGad, win);
  824.           ELSIF c= Str.backupsCh THEN
  825.             GUI.CycleGad(backupsGad, win, backupsNew, backupsLabelArrayLen);
  826.           ELSIF c= Str.autosaveCh THEN
  827.             GUI.CycleGad(autosaveGad, win, autosaveNew, autosaveLabelArrayLen);
  828.             UpdateASD;
  829.           ELSIF c= Str.aOkCh THEN
  830.             result:= cmdUse;
  831.             EXIT;
  832.           ELSIF c= Str.aCancelCh THEN
  833.             result:= cmdCancel;
  834.             EXIT;
  835.           ELSE
  836.             GUI.Flash;
  837.           END;
  838.         ELSE
  839.           GT.ReplyIMsg(iMsg);
  840.         END;
  841.       END;
  842.       IF result = cmdUse THEN
  843.         undoBufSize:= SHORT(maxChgsGad.specialInfo(I.StringInfo).longInt);
  844.         tabAlign:= SHORT(tabAlignGad.specialInfo(I.StringInfo).longInt);
  845.         margin:= SHORT(marginGad.specialInfo(I.StringInfo).longInt);
  846.         autosaveDelay:= SHORT(SHORT(autosaveDelayGad.specialInfo(I.StringInfo).longInt));
  847.         convTabs:= convTabsNew;
  848.         closeFlds:= closeFldsNew;
  849.         rmbPos:= rmbPosNew;
  850.         rmbChgs:= rmbChgsNew;
  851.         backups:= backupsNew;
  852.         autosave:= autosaveNew;
  853.         K.ClipI(undoBufSize, 0, MAX(INTEGER));
  854.         K.ClipI(tabAlign, 1, 32);
  855.         K.ClipI(margin, 1, MAX(INTEGER));
  856.         K.ClipI(autosaveDelay, 1, 60);
  857.       END;
  858.       I.CloseWindow(win);
  859.     END;
  860.     GT.FreeGadgets(gadList);
  861.   END;
  862.   IO.Refresh;
  863.   RETURN result;
  864. END ReqEditPrefs;
  865.  
  866. PROCEDURE ReqDisplayPrefs* (w: I.WindowPtr; VAR sType: SHORTINT;
  867.                      VAR sName: ARRAY OF CHAR; VAR sMode: LONGINT;
  868.                      VAR sWidth, sHeight: LONGINT; VAR sDepth: INTEGER;
  869.                      VAR foldHeader, scrollerSize: SHORTINT;
  870.                      VAR fontSpec: Gfx.TextAttr): SHORTINT;
  871.  
  872. VAR
  873.   result: SHORTINT;
  874.   defConfig: BOOLEAN;  (* running with default configuration *)
  875.   win: I.WindowPtr;
  876.   ww, wh: INTEGER;
  877.   g, gadList, context: I.GadgetPtr;
  878.   sTypeGad, sNameGad, sModeNameGad, sPageSizeGad, fontNameGad, foldHeaderGad,
  879.   scrollerSizeGad, aQuerySModeGad, aQueryFontGad: I.GadgetPtr;
  880.   fontName, sPageSize, sModeName: String;
  881.   iMsg: I.IntuiMessagePtr;
  882.   c: CHAR;
  883.   code: INTEGER;
  884.   fontSpecNew: Gfx.TextAttr;
  885.   sNameNew: String;
  886.   sTypeNew, foldHeaderNew, scrollerSizeNew: SHORTINT;
  887.   sWidthNew, sHeightNew: LONGINT;
  888.   sDepthNew: INTEGER;
  889.   sModeNew: LONGINT;
  890.  
  891.   PROCEDURE CreateFontName(VAR name: ARRAY OF CHAR; attr: Gfx.TextAttr);
  892.  
  893.   VAR
  894.     args: ARRAY 2 OF LONGINT;
  895.  
  896.   BEGIN
  897.     args[0]:= SYS.ADR(attr.name^); args[1]:= attr.ySize;
  898.     K.FormatString(name, "%s %ld", args);
  899.   END CreateFontName;
  900.  
  901.   PROCEDURE GetModeName(VAR name: ARRAY OF CHAR; id: LONGINT);
  902.  
  903.   VAR
  904.     nameInfo: Gfx.NameInfo;
  905.  
  906.   BEGIN
  907.     IF Gfx.GetDisplayInfoData(NIL, nameInfo, SIZE(nameInfo), Gfx.dtagName, id) # 0 THEN
  908.       COPY(nameInfo.name, name);
  909.     ELSE
  910.       name:= "???";
  911.     END;
  912.   END GetModeName;
  913.  
  914.   PROCEDURE CreateGadgets(VAR wWidth, wHeight: INTEGER): BOOLEAN;
  915.  
  916.   VAR
  917.     x0, w0, x1, y0, y1: INTEGER;
  918.  
  919.   BEGIN
  920.     context:= GUI.CreateContextGad(gadList);
  921.     K.Assert(context # NIL, Err.userNoGadgets);
  922.  
  923.     x0:= sTypeWd; GUI.GetMax(x0, sNameWd); GUI.GetMax(x0, sModeNameWd);
  924.     GUI.GetMax(x0, fontNameWd); GUI.GetMax(x0, foldHeaderWd);
  925.     GUI.GetMax(x0, scrollerSizeWd);
  926.     INC(x0, GUI.horizOffs);
  927.     w0:= sTypeLabelArrayWd; GUI.GetMax(w0, 30 * GUI.xWd + 6);
  928.     GUI.GetMax(w0, foldHeaderLabelArrayWd);
  929.     GUI.GetMax(w0, scrollerSizeLabelArrayWd);
  930.  
  931.     x1:= x0 + w0 + GUI.horizSpc;
  932.  
  933.     GUI.NewCol(x0, GUI.vertOffs, 2);
  934.     sTypeGad:= GUI.CreateCycleGad(sTypeID, Str.sType^, w0, sTypeLabelArray, sTypeNew, defConfig);
  935.     sNameGad:= GUI.CreateStringGad(sNameID, Str.sName^, w0, sNameNew, defConfig & (sTypeNew # Sett.screenWb));
  936.     y0:= GUI.layoutY;
  937.     sModeNameGad:= GUI.CreateTextGad(Str.sModeName^, w0, sModeName);
  938.  
  939.     GUI.NewCol(-1, GUI.layoutY - 2 + GUI.vertSpc, 2);
  940.     y1:= GUI.layoutY;
  941.     fontNameGad:= GUI.CreateTextGad(Str.fontName^, w0, fontName);
  942.     foldHeaderGad:= GUI.CreateCycleGad(foldHeaderID, Str.foldHeader^, w0,
  943.       foldHeaderLabelArray, foldHeaderNew, TRUE);
  944.     scrollerSizeGad:= GUI.CreateCycleGad(scrollerSizeID, Str.scrollerSize^, w0,
  945.       scrollerSizeLabelArray, scrollerSizeNew, TRUE);
  946.  
  947.     wHeight:= GUI.layoutY - 2 + GUI.vertSpc + GUI.buttonHt + GUI.vertOffs;
  948.  
  949.     GUI.NewCol(x0 + w0, y0, 0);
  950.     aQuerySModeGad:= GUI.CreateButtonGad(aQuerySModeID, "?", aQueryWd, (sTypeNew = Sett.screenCustom));
  951.     GUI.NewCol(-1, y1, 0);
  952.     aQueryFontGad:= GUI.CreateButtonGad(aQueryFontID, "?", aQueryWd, TRUE);
  953.  
  954.     wWidth:= GUI.layoutX + aQueryWd + GUI.horizSpc;
  955.  
  956.     RETURN CreateOkCancelGads(wWidth, wHeight);
  957.   END CreateGadgets;
  958.  
  959.   PROCEDURE SelectFont;
  960.  
  961.   BEGIN
  962.     IF ReqFont(win, fontSpecNew) THEN
  963.       CreateFontName(fontName, fontSpecNew);
  964.       GT.SetGadgetAttrs(fontNameGad^, win, NIL, GT.txText, SYS.ADR(fontName), Util.done);
  965.     END;
  966.   END SelectFont;
  967.  
  968.   PROCEDURE SelectSMode;
  969.  
  970.  BEGIN
  971.     IF screenReq # NIL THEN
  972.       IF ASL.AslRequestTags(screenReq, ASL.window, win,
  973.                             ASL.initialDisplayID, sModeNew,
  974.                             ASL.initialDisplayWidth, sWidthNew,
  975.                             ASL.initialDisplayHeight, sHeightNew,
  976.                             ASL.initialDisplayDepth, sDepthNew,
  977.                             Util.done) THEN
  978.         sModeNew:= screenReq.displayID;
  979.         sWidthNew:= screenReq.displayWidth;
  980.         sHeightNew:= screenReq.displayHeight;
  981.         sDepthNew:= screenReq.displayDepth;
  982.       END;
  983.     ELSIF EdtOS37.base # NIL THEN
  984.       IF EdtOS37.ReqScreen(win, sModeNew, sDepthNew) THEN
  985.         sWidthNew:= I.stdScreenWidth;
  986.         sHeightNew:= I.stdScreenHeight;
  987.       END;
  988.     ELSE
  989.       GUI.Flash;
  990.     END;
  991.     GetModeName(sModeName, sModeNew);
  992.     GT.SetGadgetAttrs(sModeNameGad^, win, NIL, GT.txText, SYS.ADR(sModeName), Util.done);
  993.   END SelectSMode;
  994.  
  995.   (* update select-screenType button*)
  996.   PROCEDURE NewSType;
  997.  
  998.   BEGIN
  999.     GT.SetGadgetAttrs(aQuerySModeGad^, win, NIL, I.gaDisabled,
  1000.                       I.BoolToLong(~defConfig OR (sTypeNew # Sett.screenCustom)),
  1001.                       Util.done);
  1002.     GT.SetGadgetAttrs(sNameGad^, win, NIL, I.gaDisabled,
  1003.                       I.BoolToLong(~defConfig OR (sTypeNew = Sett.screenWb)), Util.done);
  1004.     IF sTypeNew = Sett.screenWb THEN
  1005.       GT.SetGadgetAttrs(sNameGad^, win, NIL, GT.stString, SYS.ADR("Workbench"), Util.done);
  1006.     ELSE
  1007.       GT.SetGadgetAttrs(sNameGad^, win, NIL, GT.stString, SYS.ADR(sName), Util.done);
  1008.     END;
  1009.     IF sTypeNew = Sett.screenCustom THEN
  1010.       GetModeName(sModeName, sModeNew);
  1011.       GT.SetGadgetAttrs(sModeNameGad^, win, NIL, GT.txText, SYS.ADR(sModeName), Util.done);
  1012.     ELSE
  1013.       GT.SetGadgetAttrs(sModeNameGad^, win, NIL, GT.txText, NIL, Util.done);
  1014.     END;
  1015.   END NewSType;
  1016.  
  1017. BEGIN
  1018.   defConfig:= Sett.configName = Sett.defConfig;
  1019.   sTypeNew:= sType;
  1020.   sWidthNew:= sWidth;
  1021.   sHeightNew:= sHeight;
  1022.   sDepthNew:= sDepth;
  1023.   sModeNew:= sMode;
  1024.   IF sTypeNew = Sett.screenCustom THEN
  1025.     GetModeName(sModeName, sModeNew);
  1026.   ELSE
  1027.     sModeName:= "";
  1028.   END;
  1029.   COPY(sName, sNameNew);
  1030.   foldHeaderNew:= foldHeader;
  1031.   scrollerSizeNew:= scrollerSize;
  1032.   fontSpecNew:= fontSpec;
  1033.   CreateFontName(fontName, fontSpecNew);
  1034.   result:= cmdCancel;
  1035.   gadList:= NIL;
  1036.   IF CreateGadgets(ww, wh) THEN
  1037.     win:= GUI.OpenReqWindow(Str.displayPrefsTitle^, w, ww, wh,
  1038.                         LONGSET{I.refreshWindow, I.changeWindow, I.vanillaKey}
  1039.                         + GT.buttonIDCMP + GT.stringIDCMP + GT.cycleIDCMP
  1040.                         + GT.checkBoxIDCMP, gadList);
  1041.     IF win # NIL THEN
  1042.       LOOP
  1043.         iMsg:= GUI.ObtainIMsg(win);
  1044.         CASE GUI.IMsgClass(iMsg.class) OF
  1045.           I.refreshWindow:
  1046.           GT.BeginRefresh(win);
  1047.           GT.EndRefresh(win, I.LTRUE);
  1048.           GT.ReplyIMsg(iMsg);
  1049.         | I.changeWindow:
  1050.           IO.Refresh;
  1051.           GT.ReplyIMsg(iMsg);
  1052.         | I.gadgetUp:
  1053.           g:= iMsg.iAddress;
  1054.           code:= iMsg.code;
  1055.           GT.ReplyIMsg(iMsg);
  1056.           CASE g.gadgetID OF
  1057.              sTypeID:
  1058.              sTypeNew:= SHORT(code);
  1059.              NewSType;
  1060.            | scrollerSizeID:
  1061.              scrollerSizeNew:= SHORT(code);
  1062.            | foldHeaderID:
  1063.              foldHeaderNew:= SHORT(code);
  1064.            | aQueryFontID:
  1065.              SelectFont;
  1066.            | aQuerySModeID:
  1067.              SelectSMode;
  1068.            | aOkID:
  1069.              result:= cmdUse;
  1070.              EXIT;
  1071.            | aCancelID:
  1072.              result:= cmdCancel;
  1073.              EXIT
  1074.            ELSE
  1075.              (* ignore *)
  1076.            END;
  1077.         | I.vanillaKey:
  1078.           c:= Util.ToUpper(CHR(iMsg.code));
  1079.           GT.ReplyIMsg(iMsg);
  1080.           IF c= Str.sTypeCh THEN
  1081.             GUI.CycleGad(sTypeGad, win, sTypeNew, sTypeLabelArrayLen);
  1082.             NewSType;
  1083.           ELSIF c= Str.foldHeaderCh THEN
  1084.             GUI.CycleGad(foldHeaderGad, win, foldHeaderNew, foldHeaderLabelArrayLen);
  1085.           ELSIF c= Str.scrollerSizeCh THEN
  1086.             GUI.CycleGad(scrollerSizeGad, win, scrollerSizeNew, scrollerSizeLabelArrayLen);
  1087.           ELSIF c= Str.sNameCh THEN
  1088.             GUI.ActivateGad(sNameGad, win);
  1089.           ELSIF c= Str.sModeNameCh THEN
  1090.             SelectSMode;
  1091.           ELSIF c= Str.fontNameCh THEN
  1092.             SelectFont;
  1093.           ELSIF c= Str.aOkCh THEN
  1094.             result:= cmdUse;
  1095.             EXIT;
  1096.           ELSIF c= Str.aCancelCh THEN
  1097.             result:= cmdCancel;
  1098.             EXIT;
  1099.           ELSE
  1100.             GUI.Flash;
  1101.           END;
  1102.         ELSE
  1103.           GT.ReplyIMsg(iMsg);
  1104.         END;
  1105.       END;
  1106.     END;
  1107.     IF result = cmdUse THEN
  1108.       sType:= sTypeNew;
  1109.       COPY(sNameGad.specialInfo(I.StringInfo).buffer^, sName);
  1110.       sMode:= sModeNew;
  1111.       sWidth:= sWidthNew;
  1112.       sHeight:= sHeightNew;
  1113.       sDepth:= sDepthNew;
  1114.       foldHeader:= foldHeaderNew;
  1115.       scrollerSize:= scrollerSizeNew;
  1116.       fontSpec:= fontSpecNew;
  1117.     END;
  1118.     I.CloseWindow(win);
  1119.     GT.FreeGadgets(gadList);
  1120.   END;
  1121.   IO.Refresh;
  1122.   RETURN result;
  1123. END ReqDisplayPrefs;
  1124.  
  1125. PROCEDURE ReqPrint* (w: I.WindowPtr; VAR pitch, spacing, quality, formatting: SHORTINT;
  1126.                    VAR leftMargin, rightMargin, lines, colSpacing: INTEGER;
  1127.                    VAR lineNumbers, hTitle, hNumbers, hDate, hTime: BOOLEAN): SHORTINT;
  1128.  
  1129. VAR
  1130.   result: SHORTINT;
  1131.   win: I.WindowPtr;
  1132.   ww, wh: INTEGER;
  1133.   iMsg: I.IntuiMessagePtr;
  1134.   c: CHAR;
  1135.   code: INTEGER;
  1136.   g, context, gadList: I.GadgetPtr;
  1137.   pitchGad, spacingGad, qualityGad, formattingGad, leftMarginGad, rightMarginGad,
  1138.   linesGad, colSpacingGad, lineNumbersGad, hTimeGad, hTitleGad, hNumbersGad,
  1139.   hDateGad: I.GadgetPtr;
  1140.   pitchNew, spacingNew, qualityNew, formattingNew: SHORTINT;
  1141.   lineNumbersNew, hTimeNew, hTitleNew, hNumbersNew, hDateNew: BOOLEAN;
  1142.  
  1143.   PROCEDURE CreateGadgets(VAR wWidth, wHeight: INTEGER): BOOLEAN;
  1144.  
  1145.   VAR
  1146.     x1, x2, x3, w1, w2, w3, h: INTEGER;
  1147.  
  1148.   BEGIN
  1149.     context:= GUI.CreateContextGad(gadList);
  1150.     K.Assert(context # NIL, Err.userNoGadgets);
  1151.  
  1152.     x1:= leftMarginWd; GUI.GetMax(x1, rightMarginWd);
  1153.     GUI.GetMax(x1, linesWd); GUI.GetMax(x1, colSpacingWd);
  1154.     INC(x1, 8);
  1155.     w1:= (6 * GUI.zeroWd) + 12;
  1156.  
  1157.     x2:= pitchWd; GUI.GetMax(x2, spacingWd); GUI.GetMax(x2, qualityWd); GUI.GetMax(x2, formattingWd);
  1158.     INC(x2, x1 + w1 + 10);
  1159.     w2:= pitchLabelArrayWd; GUI.GetMax(w2, spacingLabelArrayWd);
  1160.     GUI.GetMax(w2, qualityLabelArrayWd); GUI.GetMax(w2, formattingLabelArrayWd);
  1161.  
  1162.     x3:= x2 + w2 + 10;
  1163.     w3:= lineNumbersWd; GUI.GetMax(w3, hTimeWd); GUI.GetMax(w3, hTitleWd);
  1164.     GUI.GetMax(w3, hNumbersWd); GUI.GetMax(w3, hDateWd);
  1165.  
  1166.     GUI.NewCol(x1, 4, 3);
  1167.     leftMarginGad:= GUI.CreateIntegerGad(leftMarginID, Str.leftMargin^, w1,
  1168.                                      leftMargin, 2, TRUE);
  1169.     rightMarginGad:= GUI.CreateIntegerGad(rightMarginID, Str.rightMargin^, w1,
  1170.                                       rightMargin, 3, TRUE);
  1171.     linesGad:= GUI.CreateIntegerGad(linesID, Str.lines^, w1, lines, 3, TRUE);
  1172.     colSpacingGad:= GUI.CreateIntegerGad(colSpacingID, Str.colSpacing^, w1, colSpacing,
  1173.                                      1, formatting # Sett.formattingOff);
  1174.     h:= GUI.layoutY;
  1175.  
  1176.     GUI.NewCol(x2, 4, 3);
  1177.     pitchGad:= GUI.CreateCycleGad(pitchID, Str.pitch^, w2, pitchLabelArray, pitch, TRUE);
  1178.     spacingGad:= GUI.CreateCycleGad(spacingID, Str.spacing^, w2, spacingLabelArray, spacing, TRUE);
  1179.     qualityGad:= GUI.CreateCycleGad(qualityID, Str.quality^, w2, qualityLabelArray, quality, TRUE);
  1180.     formattingGad:= GUI.CreateCycleGad(formattingID, Str.formatting^, w2, formattingLabelArray, formatting, TRUE);
  1181.     GUI.GetMax(h, GUI.layoutY);
  1182.  
  1183.     GUI.NewCol(x3, 4, 4);
  1184.     lineNumbersGad:= GUI.CreateCheckBoxGad(lineNumbersID, Str.lineNumbers^, lineNumbers, TRUE);
  1185.     hTitleGad:= GUI.CreateCheckBoxGad(hTitleID, Str.hTitle^, hTitle, TRUE);
  1186.     hNumbersGad:= GUI.CreateCheckBoxGad(hNumbersID, Str.hNumbers^, hNumbers, TRUE);
  1187.     hDateGad:= GUI.CreateCheckBoxGad(hDateID, Str.hDate^, hDate, TRUE);
  1188.     hTimeGad:= GUI.CreateCheckBoxGad(hTimeID, Str.hTime^, hTime, TRUE);
  1189.  
  1190.     GUI.GetMax(h, GUI.layoutY);
  1191.  
  1192.     wWidth:= x3 + w3 + 8;
  1193.     wHeight:= h + 4 + GUI.buttonHt + 4;
  1194.  
  1195.     RETURN CreateOkCancelGads(wWidth, wHeight);
  1196.   END CreateGadgets;
  1197.  
  1198.   PROCEDURE UpdateCS;
  1199.  
  1200.   BEGIN
  1201.     GT.SetGadgetAttrs(colSpacingGad^, win, NIL,
  1202.                       I.gaDisabled, I.BoolToLong(formattingNew = Sett.formattingOff),
  1203.                       Util.done);
  1204.   END UpdateCS;
  1205.  
  1206. BEGIN
  1207.   pitchNew:= pitch;
  1208.   spacingNew:= spacing;
  1209.   qualityNew:= quality;
  1210.   formattingNew:= formatting;
  1211.   lineNumbersNew:= lineNumbers;
  1212.   hTimeNew:= hTime;
  1213.   hTitleNew:= hTitle;
  1214.   hNumbersNew:= hNumbers;
  1215.   hDateNew:= hDate;
  1216.   result:= cmdCancel;
  1217.   gadList:= NIL;
  1218.   IF CreateGadgets(ww, wh) THEN
  1219.     win:= GUI.OpenReqWindow(Str.printTitle^, w, ww, wh,
  1220.                         LONGSET{I.refreshWindow, I.changeWindow, I.vanillaKey} + GT.buttonIDCMP
  1221.                         + GT.integerIDCMP + GT.cycleIDCMP + GT.checkBoxIDCMP, gadList);
  1222.     IF win # NIL THEN
  1223.       LOOP
  1224.         iMsg:= GUI.ObtainIMsg(win);
  1225.         CASE GUI.IMsgClass(iMsg.class) OF
  1226.                   I.refreshWindow:
  1227.                         GT.BeginRefresh(win);
  1228.                         GT.EndRefresh(win, I.LTRUE);
  1229.                         GT.ReplyIMsg(iMsg);
  1230.         | I.changeWindow:
  1231.                         IO.Refresh;
  1232.                         GT.ReplyIMsg(iMsg);
  1233.         | I.gadgetUp:
  1234.                         g:= iMsg.iAddress;
  1235.                         code:= iMsg.code;
  1236.                         GT.ReplyIMsg(iMsg);
  1237.                         CASE g.gadgetID OF
  1238.                           pitchID:
  1239.                                 pitchNew:= SHORT(code);
  1240.                         | spacingID:
  1241.                                 spacingNew:= SHORT(code);
  1242.                         | qualityID:
  1243.                                 qualityNew:= SHORT(code);
  1244.                         | formattingID:
  1245.                                 formattingNew:= SHORT(code);
  1246.                                 UpdateCS;
  1247.                         | lineNumbersID:
  1248.                                 lineNumbersNew:= ~lineNumbersNew;
  1249.                         | hTimeID:
  1250.                                 hTimeNew:= ~hTimeNew;
  1251.                         | hTitleID:
  1252.                                 hTitleNew:= ~hTitleNew;
  1253.                         | hNumbersID:
  1254.                                 hNumbersNew:= ~hNumbersNew;
  1255.                         | hDateID:
  1256.                                 hDateNew:= ~hDateNew;
  1257.                         | aOkID:
  1258.                                 result:= cmdUse;
  1259.                                 EXIT;
  1260.                         | aCancelID:
  1261.                                 result:= cmdCancel;
  1262.                                 EXIT
  1263.                         ELSE
  1264.               (* ignore *)
  1265.                         END;
  1266.                 | I.vanillaKey:
  1267.                         c:= Util.ToUpper(CHR(iMsg.code));
  1268.                         GT.ReplyIMsg(iMsg);
  1269.                         IF c= Str.leftMarginCh THEN
  1270.                           GUI.ActivateGad(leftMarginGad, win);
  1271.                         ELSIF c= Str.rightMarginCh THEN
  1272.                           GUI.ActivateGad(rightMarginGad, win);
  1273.                         ELSIF c= Str.linesCh THEN
  1274.                           GUI.ActivateGad(linesGad, win);
  1275.                         ELSIF c= Str.colSpacingCh THEN
  1276.                           GUI.ActivateGad(colSpacingGad, win);
  1277.                         ELSIF c= Str.pitchCh THEN
  1278.                           GUI.CycleGad(pitchGad, win, pitchNew, pitchLabelArrayLen);
  1279.                         ELSIF c= Str.spacingCh THEN
  1280.                           GUI.CycleGad(spacingGad, win, spacingNew, spacingLabelArrayLen);
  1281.                         ELSIF c= Str.qualityCh THEN
  1282.                           GUI.CycleGad(qualityGad, win, qualityNew, qualityLabelArrayLen);
  1283.                         ELSIF c= Str.formattingCh THEN
  1284.                           GUI.CycleGad(formattingGad, win, formattingNew, formattingLabelArrayLen);
  1285.                           UpdateCS;
  1286.                         ELSIF c= Str.lineNumbersCh THEN
  1287.                           GUI.ToggleGad(lineNumbersGad, win, lineNumbersNew);
  1288.                         ELSIF c= Str.hTimeCh THEN
  1289.                           GUI.ToggleGad(hTimeGad, win, hTimeNew);
  1290.                         ELSIF c= Str.hTitleCh THEN
  1291.                           GUI.ToggleGad(hTitleGad, win, hTitleNew);
  1292.                         ELSIF c= Str.hNumbersCh THEN
  1293.                           GUI.ToggleGad(hNumbersGad, win, hNumbersNew);
  1294.                         ELSIF c= Str.hDateCh THEN
  1295.                           GUI.ToggleGad(hDateGad, win, hDateNew);
  1296.                         ELSIF c= Str.aOkCh THEN
  1297.                           result:= cmdUse;
  1298.                           EXIT;
  1299.                         ELSIF c= Str.aCancelCh THEN
  1300.                           result:= cmdCancel;
  1301.                           EXIT;
  1302.                         ELSE
  1303.               GUI.Flash;
  1304.                         END;
  1305.         ELSE
  1306.           GT.ReplyIMsg(iMsg);
  1307.         END;
  1308.       END;
  1309.       IF result = cmdUse THEN
  1310.         leftMargin:= SHORT(leftMarginGad.specialInfo(I.StringInfo).longInt);
  1311.         rightMargin:= SHORT(rightMarginGad.specialInfo(I.StringInfo).longInt);
  1312.         lines:= SHORT(linesGad.specialInfo(I.StringInfo).longInt);
  1313.         colSpacing:= SHORT(colSpacingGad.specialInfo(I.StringInfo).longInt);
  1314.         pitch:= pitchNew;
  1315.         spacing:= spacingNew;
  1316.         quality:= qualityNew;
  1317.         formatting:= formattingNew;
  1318.         lineNumbers:= lineNumbersNew;
  1319.         hTime:= hTimeNew;
  1320.         hTitle:= hTitleNew;
  1321.         hNumbers:= hNumbersNew;
  1322.         hDate:= hDateNew;
  1323.       END;
  1324.       I.CloseWindow(win);
  1325.     END;
  1326.     GT.FreeGadgets(gadList);
  1327.   END;
  1328.   IO.Refresh;
  1329.   RETURN result;
  1330. END ReqPrint;
  1331.  
  1332. PROCEDURE ReqGoto* (w: I.WindowPtr; VAR line: LONGINT): SHORTINT;
  1333.  
  1334. BEGIN
  1335.   RETURN ReqNumber(w, Str.gotoTitle^, Str.line^, line);
  1336. END ReqGoto;
  1337.  
  1338. PROCEDURE ReqReplace* (w: I.WindowPtr): SHORTINT;
  1339.  
  1340. VAR
  1341.   gadList, context: I.GadgetPtr;
  1342.   g: I.GadgetPtr;
  1343.   result: SHORTINT;
  1344.   iMsg: I.IntuiMessagePtr;
  1345.   win: I.WindowPtr;
  1346.   ww, wh: INTEGER;
  1347.   c: CHAR;
  1348.  
  1349.   PROCEDURE CreateGadgets(VAR wWidth, wHeight: INTEGER): BOOLEAN;
  1350.  
  1351.   VAR
  1352.     y: INTEGER;
  1353.  
  1354.   BEGIN
  1355.     context:= GUI.CreateContextGad(gadList);
  1356.     K.Assert(context # NIL, Err.userNoGadgets);
  1357.  
  1358.     wWidth:= aYesWd + aNoWd + aAllWd + aCancelWd + 46;
  1359.     wHeight:= GUI.textHt + GUI.buttonHt + 20;
  1360.     y:= GUI.textHt + 16;
  1361.  
  1362.     GUI.NewCol(8, y, 0);
  1363.     IF GUI.CreateButtonGad(aYesID, Str.aYes^, aYesWd, TRUE) = NIL THEN RETURN FALSE END;
  1364.     GUI.NewCol(18 + aYesWd, y, -1);
  1365.     IF GUI.CreateButtonGad(aNoID, Str.aNo^, aNoWd, TRUE) = NIL THEN RETURN FALSE END;
  1366.     GUI.NewCol(28 + aYesWd + aNoWd, y, -1);
  1367.     IF GUI.CreateButtonGad(aAllID, Str.aAll^, aAllWd, TRUE) = NIL THEN RETURN FALSE END;
  1368.     GUI.NewCol(38 + aYesWd + aNoWd + aAllWd, y, -1);
  1369.     RETURN GUI.CreateButtonGad(aStopID, Str.aStop^, aStopWd, TRUE) # NIL;
  1370.   END CreateGadgets;
  1371.  
  1372.   PROCEDURE WriteText;
  1373.  
  1374.   VAR
  1375.     x, y: INTEGER;
  1376.  
  1377.   BEGIN
  1378.     GT.DrawBevelBox(win.rPort, win.borderLeft + 8, win.borderTop + 4,
  1379.                      win.gzzWidth - 16, GUI.textHt + 4, GT.bbRecessed, I.LTRUE,
  1380.                      GT.visualInfo, IO.visualInfo, Util.done);
  1381.     Gfx.Move(win.rPort, win.borderLeft + 18, win.borderTop + 9 + GUI.reqFont.baseline);
  1382.     Gfx.Text(win.rPort, Str.replaceReq^, S.Length(Str.replaceReq^));
  1383.   END WriteText;
  1384.  
  1385. BEGIN
  1386.   result:= cmdCancel;
  1387.   gadList:= NIL;
  1388.   IF CreateGadgets(ww, wh) THEN
  1389.     win:= GUI.OpenReqWindowXY(Str.replaceTitle^, w, winX, winY, ww, wh,
  1390.                               LONGSET{I.refreshWindow, I.changeWindow, I.vanillaKey}
  1391.                               + GT.buttonIDCMP, gadList);
  1392.     IF win # NIL THEN
  1393.       Gfx.SetAPen(win.rPort, IO.textPen);
  1394.       Gfx.SetFont(win.rPort, GUI.reqFont);
  1395.       WriteText;
  1396.       LOOP
  1397.         iMsg:= GUI.ObtainIMsg(win);
  1398.         CASE GUI.IMsgClass(iMsg.class) OF
  1399.           I.refreshWindow: GT.BeginRefresh(win);
  1400.                            WriteText;
  1401.                            GT.EndRefresh(win, I.LTRUE);
  1402.                            GT.ReplyIMsg(iMsg);
  1403.         | I.changeWindow:  IO.Refresh;
  1404.                            GT.ReplyIMsg(iMsg);
  1405.         | I.gadgetUp:      g:= iMsg.iAddress;
  1406.                            GT.ReplyIMsg(iMsg);
  1407.                            CASE g.gadgetID OF
  1408.                              aYesID   : result:= cmdYes;
  1409.                            | aNoID    : result:= cmdNo;
  1410.                            | aAllID   : result:= cmdAll;
  1411.                            | aStopID: result:= cmdCancel;
  1412.                            END;
  1413.                            EXIT;
  1414.         | I.vanillaKey:
  1415.             c:= Util.ToUpper(CHR(iMsg.code));
  1416.             GT.ReplyIMsg(iMsg);
  1417.             IF c= Str.aStopCh THEN
  1418.               result:= cmdCancel;
  1419.               EXIT;
  1420.             ELSIF c= Str.aNoCh THEN
  1421.               result:= cmdNo;
  1422.               EXIT;
  1423.             ELSIF c= Str.aYesCh THEN
  1424.               result:= cmdYes;
  1425.               EXIT;
  1426.             ELSIF c= Str.aAllCh THEN
  1427.               result:= cmdAll;
  1428.               EXIT;
  1429.             ELSE
  1430.               GUI.Flash;
  1431.             END;
  1432.         ELSE
  1433.           GT.ReplyIMsg(iMsg);
  1434.         END;
  1435.       END;
  1436.       winX:= win.leftEdge; winY:= win.topEdge;
  1437.       I.CloseWindow(win);
  1438.     END;
  1439.     GT.FreeGadgets(gadList);
  1440.   END;
  1441.   IO.Refresh;
  1442.   RETURN result;
  1443. END ReqReplace;
  1444.  
  1445. PROCEDURE ReqSR(w: I.WindowPtr; VAR searchStr, replaceStr: ARRAY OF CHAR;
  1446.                 VAR ignoreCase, findWord, linkChgs: BOOLEAN;
  1447.                 replace: BOOLEAN): SHORTINT;
  1448.  
  1449. VAR
  1450.   c: CHAR;
  1451.   result: SHORTINT;
  1452.   win: I.WindowPtr;
  1453.   ww, wh: INTEGER;
  1454.   iMsg: I.IntuiMessagePtr;
  1455.   code: INTEGER;
  1456.   g: I.GadgetPtr;
  1457.   searchGad, findWordGad, ignoreCaseGad, linkChgsGad, replaceGad: I.GadgetPtr;
  1458.   gadList, context: I.GadgetPtr;
  1459.  
  1460.   PROCEDURE OpenWindow(title: ARRAY OF CHAR): BOOLEAN;
  1461.  
  1462.   (* $CopyArrays- *)
  1463.  
  1464.   BEGIN
  1465.     win:= GUI.OpenReqWindow(title, w, ww, wh, LONGSET{I.refreshWindow, I.changeWindow, I.vanillaKey}
  1466.                         + GT.buttonIDCMP + GT.checkBoxIDCMP + GT.stringIDCMP, gadList);
  1467.     RETURN win # NIL;
  1468.   END OpenWindow;
  1469.  
  1470.   PROCEDURE CreateGadgets(VAR wWidth, wHeight: INTEGER): BOOLEAN;
  1471.  
  1472.   VAR
  1473.     y, aw, sw, ow, oh, fw, sx, ox: INTEGER;
  1474.  
  1475.   BEGIN
  1476.     context:= GUI.CreateContextGad(gadList);
  1477.     K.Assert(context # NIL, Err.userNoGadgets);
  1478.  
  1479.     ow:= ignoreCaseWd; GUI.GetMax(ow, findWordWd);
  1480.     fw:= 320 + 12;
  1481.     sx:= searchWd;
  1482.     wHeight:= GUI.stringHt + GUI.buttonHt + 16;
  1483.     IF replace THEN
  1484.       aw:= aReplaceWd + aReplaceBackWd;
  1485.       GUI.GetMax(ow, linkChgsWd);
  1486.       oh:= 3 * GUI.checkBoxHt;
  1487.       GUI.GetMax(sx, replaceWd);
  1488.       INC(wHeight, GUI.stringHt + 4);
  1489.     ELSE
  1490.       aw:= aSearchWd + aSearchBackWd;
  1491.       oh:= 2 * GUI.checkBoxHt;
  1492.     END;
  1493.     INC(aw, aCancelWd + 36);
  1494.     INC(sx, 8);
  1495.     ox:= sx + fw + 10;
  1496.  
  1497.     wWidth:= aw; GUI.GetMax(wWidth, sx + fw + ow + 18 + GUI.checkBoxWd);
  1498.     GUI.GetMax(wHeight, oh + GUI.buttonHt + 16);
  1499.  
  1500.     GUI.NewCol(ox, 4, 0);
  1501.     ignoreCaseGad:= GUI.CreateCheckBoxGad(ignoreCaseID, Str.ignoreCase^, ignoreCase, TRUE);
  1502.     findWordGad:= GUI.CreateCheckBoxGad(findWordID, Str.findWord^, findWord, TRUE);
  1503.     IF replace THEN
  1504.       linkChgsGad:= GUI.CreateCheckBoxGad(linkChgsID, Str.linkChgs^, linkChgs, TRUE);
  1505.     END;
  1506.  
  1507.     GUI.NewCol(sx, 4, 4);
  1508.     searchGad:= GUI.CreateStringGad(searchID, Str.search^, fw, searchStr, TRUE);
  1509.     IF replace THEN
  1510.       y:= wHeight - 4 - GUI.buttonHt;
  1511.       replaceGad:= GUI.CreateStringGad(replaceID, Str.replace^, fw, replaceStr, TRUE);
  1512.  
  1513.       GUI.NewCol(8, y, -1);
  1514.       IF GUI.CreateButtonGad(aNextID, Str.aReplace^, aReplaceWd, TRUE) = NIL THEN RETURN FALSE END;
  1515.       GUI.NewCol((wWidth - aReplaceBackWd) DIV 2, y, -1);
  1516.       IF GUI.CreateButtonGad(aPrevID, Str.aReplaceBack^, aReplaceBackWd, TRUE) = NIL THEN RETURN FALSE END;
  1517.     ELSE
  1518.       y:= wHeight - GUI.buttonHt - 4;
  1519.  
  1520.       GUI.NewCol(8, y, -1);
  1521.       IF GUI.CreateButtonGad(aNextID, Str.aSearch^, aSearchWd, TRUE) = NIL THEN RETURN FALSE END;
  1522.       GUI.NewCol((wWidth - aSearchBackWd) DIV 2, y, -1);
  1523.       IF GUI.CreateButtonGad(aPrevID, Str.aSearchBack^, aSearchBackWd, TRUE) = NIL THEN RETURN FALSE END;
  1524.     END;
  1525.  
  1526.     GUI.NewCol(wWidth - aCancelWd - 8, y, -1);
  1527.     RETURN GUI.CreateButtonGad(aCancelID, Str.aCancel^, aCancelWd, TRUE) # NIL;
  1528.   END CreateGadgets;
  1529.  
  1530. BEGIN
  1531.   result:= cmdCancel;
  1532.   gadList:= NIL;
  1533.   IF CreateGadgets(ww, wh) THEN
  1534.     IF (replace & OpenWindow(Str.replaceTitle^))
  1535.       OR OpenWindow(Str.searchTitle^) THEN
  1536.       GUI.ActivateGad(searchGad, win);
  1537.       LOOP
  1538.         iMsg:= GUI.ObtainIMsg(win);
  1539.         CASE GUI.IMsgClass(iMsg.class) OF
  1540.           I.refreshWindow: GT.BeginRefresh(win);
  1541.                            GT.EndRefresh(win, I.LTRUE);
  1542.                            GT.ReplyIMsg(iMsg);
  1543.         | I.changeWindow:  IO.Refresh;
  1544.                            GT.ReplyIMsg(iMsg);
  1545.         | I.vanillaKey:    c:= Util.ToUpper(CHR(iMsg.code));
  1546.                            GT.ReplyIMsg(iMsg);
  1547.                            IF c= Str.searchCh THEN
  1548.                              GUI.ActivateGad(searchGad, win);
  1549.                            ELSIF c= Str.replaceCh THEN
  1550.                              IF replace THEN
  1551.                                GUI.ActivateGad(replaceGad, win)
  1552.                              ELSE
  1553.                                GUI.Flash;
  1554.                              END;
  1555.                            ELSIF c= Str.ignoreCaseCh THEN
  1556.                                GUI.ToggleGad(ignoreCaseGad, win, ignoreCase);
  1557.                            ELSIF c= Str.findWordCh THEN
  1558.                                GUI.ToggleGad(findWordGad, win, findWord);
  1559.                            ELSIF c= Str.linkChgsCh THEN
  1560.                                GUI.ToggleGad(linkChgsGad, win, linkChgs);
  1561.                            ELSIF c= Str.aCancelCh THEN
  1562.                                result:= cmdCancel;
  1563.                                EXIT;
  1564.                            ELSE
  1565.                              IF replace THEN
  1566.                                IF c= Str.aReplaceCh THEN
  1567.                                  result:= cmdNext;
  1568.                                  EXIT;
  1569.                                ELSIF c= Str.aReplaceBackCh THEN
  1570.                                  result:= cmdPrev;
  1571.                                  EXIT;
  1572.                                END;
  1573.                              ELSE
  1574.                                IF c= Str.aSearchCh THEN
  1575.                                  result:= cmdNext;
  1576.                                  EXIT;
  1577.                                ELSIF c= Str.aSearchBackCh THEN
  1578.                                  result:= cmdPrev;
  1579.                                  EXIT;
  1580.                                END;
  1581.                              END;
  1582.                              GUI.Flash;
  1583.                            END;
  1584.         | I.gadgetUp:      g:= iMsg.iAddress;
  1585.                            code:= iMsg.code;
  1586.                            GT.ReplyIMsg(iMsg);
  1587.                            CASE g.gadgetID OF
  1588.                              aCancelID    : result:= cmdCancel;
  1589.                                             EXIT;
  1590.                            | aNextID      : result:= cmdNext;
  1591.                                             EXIT;
  1592.                            | aPrevID      : result:= cmdPrev;
  1593.                                             EXIT;
  1594.                            | searchID     : IF (code # GUI.escKey) & (code # GUI.tabKey) THEN
  1595.                                               IF ~replace THEN
  1596.                                                 result:= cmdNext;
  1597.                                                 EXIT;
  1598.                                               END;
  1599.                                             END;
  1600.                            | replaceID    : IF (code # GUI.escKey) & (code # GUI.tabKey) THEN
  1601.                                               result:= cmdNext;
  1602.                                               EXIT;
  1603.                                             END;
  1604.                            | findWordID   : findWord:= ~findWord;
  1605.                            | ignoreCaseID : ignoreCase:= ~ignoreCase;
  1606.                            | linkChgsID   : linkChgs:= ~linkChgs;
  1607.                            END;
  1608.         ELSE
  1609.           GT.ReplyIMsg(iMsg);
  1610.         END;
  1611.       END;
  1612.       IF result # cmdCancel THEN
  1613.         COPY(searchGad.specialInfo(I.StringInfo).buffer^, searchStr);
  1614.         IF replace THEN COPY(replaceGad.specialInfo(I.StringInfo).buffer^, replaceStr) END;
  1615.       END;
  1616.       I.CloseWindow(win);
  1617.     END;
  1618.     GT.FreeGadgets(gadList);
  1619.   END;
  1620.   IO.Refresh;
  1621.   RETURN result;
  1622. END ReqSR;
  1623.  
  1624. PROCEDURE ReqSearch* (w: I.WindowPtr; VAR searchStr: ARRAY OF CHAR;
  1625.                       VAR ignoreCase, findWord: BOOLEAN): SHORTINT;
  1626.  
  1627. VAR
  1628.   a: ARRAY 1 OF CHAR;
  1629.   b: BOOLEAN;
  1630.  
  1631. BEGIN
  1632.   RETURN ReqSR(w, searchStr, a, ignoreCase, findWord, b, FALSE);
  1633. END ReqSearch;
  1634.  
  1635. PROCEDURE ReqSearchRep* (w: I.WindowPtr; VAR searchStr, replaceStr: ARRAY OF CHAR;
  1636.                          VAR ignoreCase, findWord, linkChgs: BOOLEAN): SHORTINT;
  1637.  
  1638. BEGIN
  1639.   RETURN ReqSR(w, searchStr, replaceStr, ignoreCase, findWord, linkChgs, TRUE);
  1640. END ReqSearchRep;
  1641.  
  1642. PROCEDURE AllocAslReqs;
  1643.  
  1644. BEGIN
  1645.   fileReq:= ASL.AllocAslRequestTags(ASL.fileRequest,
  1646.                                     ASL.doPatterns, I.LTRUE,
  1647.                                     ASL.initialPattern, SYS.ADR(Sett.fileReqPattern),
  1648.                                     ASL.initialWidth, Sett.fileReqWidth,
  1649.                                     ASL.initialHeight, Sett.fileReqHeight,
  1650.                                     Util.done);
  1651.   fontReq:= ASL.AllocAslRequestTags(ASL.fontRequest,
  1652.                                     ASL.titleText, Str.selectFontTitle,
  1653.                                     ASL.fixedWidthOnly, I.LTRUE,
  1654.                                     ASL.initialName, Sett.fontSpec.name,
  1655.                                     ASL.initialSize, Sett.fontSpec.ySize,
  1656.                                     Util.done);
  1657.   screenReq:= ASL.AllocAslRequestTags(ASL.screenModeRequest,
  1658.                                     ASL.titleText, Str.selectCustomScreenTitle,
  1659.                                     ASL.doWidth, I.LTRUE,
  1660.                                     ASL.doHeight, I.LTRUE,
  1661.                                     ASL.doDepth, I.LTRUE,
  1662.                                     ASL.smMinWidth, 640,
  1663.                                     ASL.smMaxDepth, 8,
  1664.                                     Util.done);
  1665.  
  1666.   K.Assert((fileReq # NIL) & (fontReq # NIL), Err.userNoReqs);
  1667. END AllocAslReqs;
  1668.  
  1669. BEGIN
  1670.   fileReq:= NIL;
  1671.   fontReq:= NIL;
  1672.   screenReq:= NIL;
  1673.   winX:= IO.screen.width DIV 3; winY:= IO.screen.height DIV 3;
  1674.  
  1675.   GUI.CreateLabelArray(backupsLabelArray, backupsLabelArrayLen, backupsLabelArrayWd, Str.backupsLabels^);
  1676.   INC(backupsLabelArrayWd, GUI.cycleImgWd + 16);
  1677.   GUI.CreateLabelArray(autosaveLabelArray, autosaveLabelArrayLen, autosaveLabelArrayWd, Str.autosaveLabels^);
  1678.   INC(autosaveLabelArrayWd, GUI.cycleImgWd + 16);
  1679.   GUI.CreateLabelArray(sTypeLabelArray, sTypeLabelArrayLen, sTypeLabelArrayWd, Str.sTypeLabels^);
  1680.   INC(sTypeLabelArrayWd, GUI.cycleImgWd + 16);
  1681.   GUI.CreateLabelArray(pitchLabelArray, pitchLabelArrayLen, pitchLabelArrayWd, Str.pitchLabels^);
  1682.   INC(pitchLabelArrayWd, GUI.cycleImgWd + 16);
  1683.   GUI.CreateLabelArray(spacingLabelArray, spacingLabelArrayLen, spacingLabelArrayWd, Str.spacingLabels^);
  1684.   INC(spacingLabelArrayWd, GUI.cycleImgWd + 16);
  1685.   GUI.CreateLabelArray(qualityLabelArray, qualityLabelArrayLen, qualityLabelArrayWd, Str.qualityLabels^);
  1686.   INC(qualityLabelArrayWd, GUI.cycleImgWd + 16);
  1687.   GUI.CreateLabelArray(formattingLabelArray, formattingLabelArrayLen, formattingLabelArrayWd, Str.formattingLabels^);
  1688.   INC(formattingLabelArrayWd, GUI.cycleImgWd + 16);
  1689.   GUI.CreateLabelArray(foldHeaderLabelArray, foldHeaderLabelArrayLen, foldHeaderLabelArrayWd, Str.foldHeaderLabels^);
  1690.   INC(foldHeaderLabelArrayWd, GUI.cycleImgWd + 16);
  1691.   GUI.CreateLabelArray(scrollerSizeLabelArray, scrollerSizeLabelArrayLen, scrollerSizeLabelArrayWd, Str.scrollerSizeLabels^);
  1692.   INC(scrollerSizeLabelArrayWd, GUI.cycleImgWd + 16);
  1693.  
  1694.   searchWd:= GUI.TextWidth(Str.search^) + 6;
  1695.   replaceWd:= GUI.TextWidth(Str.replace^) + 6;
  1696.   ignoreCaseWd:= GUI.TextWidth(Str.ignoreCase^) + 6;
  1697.   findWordWd:= GUI.TextWidth(Str.findWord^) + 6;
  1698.   linkChgsWd:= GUI.TextWidth(Str.linkChgs^) + 6;
  1699.   aSearchWd:= GUI.TextWidth(Str.aSearch^) + 16;
  1700.   aSearchBackWd:= GUI.TextWidth(Str.aSearchBack^) + 16;
  1701.   aReplaceWd:= GUI.TextWidth(Str.aReplace^) + 16;
  1702.   aReplaceBackWd:= GUI.TextWidth(Str.aReplaceBack^) + 16;
  1703.   aCancelWd:= GUI.TextWidth(Str.aCancel^) + 16;
  1704.   aNoWd:= GUI.TextWidth(Str.aNo^) + 24;
  1705.   aYesWd:= GUI.TextWidth(Str.aYes^) + 24;
  1706.   aAllWd:= GUI.TextWidth(Str.aAll^) + 24;
  1707.   aStopWd:= GUI.TextWidth(Str.aStop^) + 24;
  1708.   aOkWd:= GUI.TextWidth(Str.aOk^) + 24;
  1709.   convTabsWd:= GUI.TextWidth(Str.convTabs^) + 6;
  1710.   closeFldsWd:= GUI.TextWidth(Str.closeFlds^) + 6;
  1711.   rmbChgsWd:= GUI.TextWidth(Str.rmbChgs^) + 6;
  1712.   maxChgsWd:= GUI.TextWidth(Str.maxChgs^) + 6;
  1713.   tabAlignWd:= GUI.TextWidth(Str.tabAlign^) + 6;
  1714.   marginWd:= GUI.TextWidth(Str.margin^) + 6;
  1715.   autosaveDelayWd:= GUI.TextWidth(Str.autosaveDelay^) + 6;
  1716.   fontNameWd:= GUI.TextWidth(Str.fontName^) + 6;
  1717.   aQueryWd:= GUI.TextWidth("?") + 16;
  1718.   autosaveWd:= GUI.TextWidth(Str.autosave^) + 6;
  1719.   backupsWd:= GUI.TextWidth(Str.backups^) + 6;
  1720.   sTypeWd:= GUI.TextWidth(Str.sType^) + 6;
  1721.   sNameWd:= GUI.TextWidth(Str.sName^) + 6;
  1722.   sModeNameWd:= GUI.TextWidth(Str.sModeName^) + 6;
  1723.   leftMarginWd:= GUI.TextWidth(Str.leftMargin^) + 6;
  1724.   rightMarginWd:= GUI.TextWidth(Str.rightMargin^) + 6;
  1725.   linesWd:= GUI.TextWidth(Str.lines^) + 6;
  1726.   colSpacingWd:= GUI.TextWidth(Str.colSpacing^) + 6;
  1727.   pitchWd:= GUI.TextWidth(Str.pitch^) + 6;
  1728.   spacingWd:= GUI.TextWidth(Str.spacing^) + 6;
  1729.   qualityWd:= GUI.TextWidth(Str.quality^) + 6;
  1730.   formattingWd:= GUI.TextWidth(Str.formatting^) + 6;
  1731.   lineNumbersWd:= GUI.TextWidth(Str.lineNumbers^) + GUI.checkBoxWd + 6;
  1732.   hTimeWd:= GUI.TextWidth(Str.hTime^) + GUI.checkBoxWd + 6;
  1733.   hTitleWd:= GUI.TextWidth(Str.hTitle^) + GUI.checkBoxWd + 6;
  1734.   hNumbersWd:= GUI.TextWidth(Str.hNumbers^) + GUI.checkBoxWd + 6;
  1735.   hDateWd:= GUI.TextWidth(Str.hDate^) + GUI.checkBoxWd + 6;
  1736.   scrollerSizeWd:= GUI.TextWidth(Str.scrollerSize^) + GUI.checkBoxWd + 6;
  1737.  
  1738.   AllocAslReqs;
  1739.  
  1740. CLOSE
  1741.   IF screenReq # NIL THEN
  1742.     ASL.FreeAslRequest(screenReq);
  1743.   END;
  1744.   IF fileReq # NIL THEN
  1745.     ASL.FreeAslRequest(fileReq);
  1746.   END;
  1747.   IF fontReq # NIL THEN
  1748.     ASL.FreeAslRequest(fontReq);
  1749.   END;
  1750. END ERequests.
  1751.